﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using fideeraSoft.DAO;
using System.Data.SqlClient;
using fideeraSoft.Utils;
using fideeraSoft.Entities;

namespace fideeraSoft.DAOimpl
{
    public class ProduccionDAOSQLimpl:ProduccionDAO
    {

        #region BUSCAR ULTIMO ID DE Produccion
        public int buscarNuevoUltimoIdProduccionBD()
        {
            int ID = 0;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT TOP 1 ID FROM Produccion ORDER BY ID DESC ";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {

                    while (reader.Read())
                    {
                        ID = reader.GetInt32(0);
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }
                    ID++;
                }
                else
                {
                    ID = 1;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarNuevoUltimoIdProduccionBD] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarNuevoUltimoIdProduccionBD] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return ID;
        }

        #endregion

        #region ALTA PRODUCCION
        public void altaProduccion(Produccion produccion)
        {
            SqlConnection conn = null;
            try
            {
                conn = SQLclass.conectarSQL();
                conn.Open();

                string query = "SET IDENTITY_INSERT Produccion ON; INSERT INTO Produccion (ID,producto,fechaInicio,observacion) VALUES (@IdProduccion,@Producto,@FechaInicio,@Observacion)";
                //string query = "INSERT INTO Proveedor (razonSocial,responsable,cuil,direccion,localidad,provincia,telefono,celular) VALUES (@RazonSocial,@Responsable,@Cuil,@Direccion,@Localidad,@Provincia,@Telefono,@Celular)";
                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@IdProduccion", produccion.IdProduccion);
                cmd.Parameters.AddWithValue("@Producto",produccion.Producto );
                cmd.Parameters.AddWithValue("@FechaInicio", produccion.FechaInicio);
                cmd.Parameters.AddWithValue("@Observacion", produccion.Observacion);
                
                cmd.ExecuteNonQuery();
                //cmd.Parameters.Clear();
                // cmd.CommandText = "SELECT @@IDENTITY";
                // int insertID=Convert.ToInt32(cmd.ExecuteScalar());

                //  cmd.Dispose();
                cmd = null;

                //cmd.Connection.Close();
                /*DataTable dt = new DataTable();
                DA.Fill(dt);
                */
            }
            catch (Exception e)
            {
                CLogger.Append("[altaProduccion] Exception alta: " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[altaProduccion] Exception alta: " + e);
            }
            finally
            {
                conn.Close();
            }

        }

        #endregion

        #region UPDATE FECHA FIN DE PRODUCCION
        public void updateFechaFinProduccionPorId(string id,DateTime dtFechaFin)
        {

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "UPDATE Produccion SET fechaFin=@FechaFin WHERE ID=@Id";

                SqlCommand cmd = new SqlCommand(query, conn);

                //cmd.Parameters.AddWithValue("@FechaFin",dtFechaFin.ToString("MM/dd/yyyy hh:mm:ss") );
                cmd.Parameters.AddWithValue("@FechaFin", dtFechaFin);
                cmd.Parameters.AddWithValue("@Id", id);
                

                cmd.ExecuteNonQuery();

                cmd = null;
            }
            catch (Exception e)
            {
                CLogger.Append("[updateFechaFinProduccionPorId] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[updateFechaFinProduccionPorId] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

        }

        #endregion

        #region UPDATE FECHA Inicio ENVASADO
        public void updateFechaInicioEnvasadoProduccionPorId(string id, DateTime dtFechaEnvasado)
        {

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "UPDATE Produccion SET fechaInicioEnvasado=@FechaInicioEnvasado WHERE ID=@Id";

                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@FechaInicioEnvasado", dtFechaEnvasado);
                cmd.Parameters.AddWithValue("@Id", id);


                cmd.ExecuteNonQuery();

                cmd = null;
            }
            catch (Exception e)
            {
                CLogger.Append("[updateFechaInicioEnvasadoProduccionPorId] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[updateFechaInicioEnvasadoProduccionPorId] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

        }

        #endregion

        #region UPDATE FECHA FIN ENVASADO EN PRODUCCION
        public void updateFechaFinEnvasadoEnProduccionPorId(string id, DateTime dateTime)
        {

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "UPDATE Produccion SET fechaFinEnvasado=@FechaFinEnvasado WHERE ID=@Id";

                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@FechaFinEnvasado", dateTime);
                cmd.Parameters.AddWithValue("@Id", id);


                cmd.ExecuteNonQuery();

                cmd = null;
            }
            catch (Exception e)
            {
                CLogger.Append("[updateFechaFinEnvasadoProduccionPorId] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[updateFechaFinEnvasadoProduccionPorId] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

        }

        #endregion

        #region UPDATE CANT PAQUETES ENVASADOS EN PRODUCCION
        public void updateCantidadPaquetesEnvasadosEnProduccionPorId(string id, string cantPaq)
        {

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "UPDATE Produccion SET cantidadPaquetes=@CantidadPaquetes WHERE ID=@Id";

                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@CantidadPaquetes", cantPaq);
                cmd.Parameters.AddWithValue("@Id", id);


                cmd.ExecuteNonQuery();

                cmd = null;
            }
            catch (Exception e)
            {
                CLogger.Append("[updateFechaFinEnvasadoProduccionPorId] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[updateFechaFinEnvasadoProduccionPorId] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

        }

        #endregion


        #region UPDATE FECHA DE REMITO SALIDA EN PRODUCCION
        public void updateFechaFinSalidaEnProduccion(string strIdProduccion, DateTime dateTime)
        {

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "UPDATE Produccion SET fechaSalida=@FechaSalida WHERE ID=@Id";

                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@FechaSalida", dateTime);
                cmd.Parameters.AddWithValue("@Id", strIdProduccion);


                cmd.ExecuteNonQuery();

                cmd = null;
            }
            catch (Exception e)
            {
                CLogger.Append("[updateFechaFinSalidaEnProduccion] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[updateFechaFinSalidaEnProduccion] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

        }

        #endregion


        #region UPDATE OBSERVACION FINAL EN PRODUCCION
        public void updateObservacionFinalDeProduccionPorId(string id, string observacionFinal)
        {

            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "UPDATE Produccion SET observacionFinal=@ObservacionFinal WHERE ID=@Id";

                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@ObservacionFinal", observacionFinal);
                cmd.Parameters.AddWithValue("@Id", id);


                cmd.ExecuteNonQuery();

                cmd = null;
            }
            catch (Exception e)
            {
                CLogger.Append("[updateObservacionFinalDeProduccionPorId] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[updateObservacionFinalDeProduccionPorId] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

        }

        #endregion

        


        #region OBTENER CANTIDAD TOTAL PAQUETES PRODUCTOS PRODUCIDOS POR ID PRODUCTO

        public int obtenerCantidadTotalPaquetesProducicosPorIdProduco(string idProducto)
        {
            int cant = 0;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT SUM(cantidadPaquetes) AS CantidadPaquetes FROM Produccion WHERE producto='" + idProducto + "'";

                //MessageBox.Show("QUERY: "+query, "INFO", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); //DEBUG

                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {

                    while (reader.Read())
                    {
                        cant = reader.GetInt32(0);
                        // MessageBox.Show("CANT: " + cant.ToString(), "INFO", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); //DEBUG
                    }

                }
                else
                {
                    cant = -1;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[obtenerCantidadTotalPaquetesProducicosPorIdProduco] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[obtenerCantidadTotalPaquetesProducicosPorIdProduco] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return cant;
        }

        #endregion


        #region Eliminar PRODUCCION POR ID

        public void eliminarProduccionPorId(int id)
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM Produccion WHERE ID='"+id.ToString()+"'";
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarProduccionPorId] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarProduccionPorId] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }
        #endregion


        #region Eliminar TODA PRODUCCION EN DB

        public void eliminarTodasLasProduccionesEnDb()
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM Produccion";
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarTodasLasProduccionesEnDb] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarTodasLasProduccionesEnDb] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }
        #endregion
    }
}
